//
// Created by 刘振舟 on 2024/3/18.
//
#include <stdio.h>
#include <string.h>

char* reverse(char *s, int left, int right) {
    while (left < right) {
        char temp = s[left];
        s[left++] = s[right];
        s[right--] = temp;
    }
    return s;
}

/**
 *
 * todo
 * heep-overflow-version
 */
// char* reverseWords(char* s) {
//     int right = strlen(s) - 1;
//     reverse(s, 0, right);
//     int left = 0;
//     while (s[left] == ' ') {
//         ++left;
//     };
//     while (s[right] == ' ') {
//         --right;
//     };
//     int i = left, j = left, index = 0;
//     while (j <= right) {
//         if (s[j] == ' ') {
//             if (s[j - 1] != ' ') {
//                 reverse(s, i, j - 1);
//                 for (int k = i; k < j; ++k) {
//                     s[index++] = s[k];
//                 }
//
//             }
//         } else {
//             if (s[j - 1] == ' ' && index > 0) {
//                 s[index++] = ' ';
//                 i = j;
//             }
//         }
//         ++j;
//     }
//     reverse(s, i, j - 1);
//     for (int k = i; k < j; ++k) {
//         s[index++] = s[k];
//     }
//     s[index] = '\0';
//     return s;
// }

// 不是自己写的代码，等待开会员后调试
char* reverseWords(char* s) {
    int start = 0;
    int end = strlen(s)-1;
    reverse(s,start,end);
    if(s[0]==' '){
        int i = 0;
        while(s[i]==' '){
            i++;
        }
        int j = 0;
        while(s[i]!='\0'){
            s[j] = s[i];
            i++;
            j++;
        }
        s[j] = '\0';
    }
    int check = 0;
    while(s[check]!='\0'){
        check++;
    }
    if(s[check-1]==' '){
        int o = check - 1;
        while(s[o]==' '){
            o--;
        }
        s[o+1] = '\0';
    }
    for(int k = 0;k<strlen(s);k++){
        if(s[k]==' '&&s[k+1]==' '){
            int i = k;
            while(s[i]==' '){
                i++;
            }
            int j = k+1;
            while(s[i]!='\0'){
                s[j] = s[i];
                i++;
                j++;
            }
            s[j] = '\0';
        }
    }
    int slow = 0;
    for(int u = 0;u<=strlen(s);u++){
        if(s[u]==' '||s[u]=='\0'){
            reverse(s,slow,u-1);
            slow = u+1;
        }
    }
    return s;
}


int main() {
    char s[] = "a good   example";
    printf("%s", reverseWords(s));
    return 0;
}